package com.liesheng.haylou.utils;

import android.text.TextUtils;

import com.liesheng.haylou.net.HttpUrl;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FormatUtil {
    /**
     * 检查用户名
     */
    public static boolean validateUserName(String userName) {
        return matches("^[A-Za-z][A-Za-z0-9_]{5,17}$", userName);
    }

    /**
     * 检查登录密码（6-16位任意字符）
     */
    public static boolean validateLoginPwd(String pwd) {
        return matches("^[\\w\\W]{6,20}$", pwd);
    }

    /**
     * 检验数字输入框大于零且不能为"-"或"+"
     */
    public static boolean validateEditParams(String editStr) {
        return matches("^(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$", editStr);
    }

    /**
     * 检测真实姓名格式
     */
    public static boolean validateRealName(String name) {
        return matches("([.,·,\\u4e00-\\u9fa5]{2,50})$",name);
    }

    /**
     * 检测邮箱验证格式
     */
    public static boolean validateEmail(String email) {
        return matches(HttpUrl.BASE_URL, email);
    }

    /**
     * 检测邮箱验证格式
     */
    public static boolean validateEmailQQ(String email) {
        int index = email.indexOf("@");
        String emailPre = email.substring(0, index);
        String emailHou = email.substring(index);
        if (emailHou.contains("qq.com")) {
            return emailPre.matches("^\\d{5,11}$");
        }
        return true;
    }

    /**
     * 检测money格式
     */
    public static boolean validateMoney(String money) {
        return matches("^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$", money);
    }

    /**
     * 检测电话号码
     */
    public static boolean validatePhone(String phone) {
        return matches("^1\\d{10}$", phone);
    }

    public static boolean checkIdCard(String idCard) {
        //		if (matches("/^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$/",
        //			idCard))
        //		{
        /*
         * 身份证15位编码规则：dddddd yymmdd xx p
         * dddddd：6位地区编码
         * yymmdd: 出生年(两位年)月日，如：910215
         * xx: 顺序编码，系统产生，无法确定
         * p: 性别，奇数为男，偶数为女
         *
         * 身份证18位编码规则：dddddd yyyymmdd xxx y
         * dddddd：6位地区编码
         * yyyymmdd: 出生年(四位年)月日，如：19910215
         * xxx：顺序编码，系统产生，无法确定，奇数为男，偶数为女
         * y: 校验码，该位数值可通过前17位计算获得
         *
         * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
         * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
         * 如果验证码恰好是10，为了保证身份证是十八位，那么第十八位将用X来代替
         * 校验位计算公式：Y_P = mod( ∑(Ai×Wi),11 )
         * i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置
         */

        //将前17位加权因子保存在数组里
        int[] idCardWi = new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        //这是除以11后，可能产生的11位余数、验证码，也保存成数组
        int[] idCardY = new int[]{1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2};
        int idCardWiSum = 0; //用来保存前17位各自乖以加权因子后的总和
        for (int i = 0; i < 17; i++) {
            idCardWiSum += Integer.parseInt(idCard.substring(i, i + 1)) * idCardWi[i];
        }
        int idCardMode = idCardWiSum % 11; //计算出校验码所在数组的位置
        String idCardLast = idCard.substring(17);//得到最后一位身份证号码
        //如果等于2，则说明校验码是10，身份证号码最后一位应该是X
        if (idCardMode == 2) {
            if ("X".equals(idCardLast) || "x".equals(idCardLast)) {
                return true;
            } else {
                return false;
            }
        } else {
            //用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
            if (idCardLast.equals(idCardY[idCardMode] + "")) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 正则表达式检查
     *
     * @param regex
     * @param src
     * @return
     */
    public static boolean matches(String regex, String src) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(src);
        return matcher.matches();
    }

    /**
     * 保留2位小数
     *
     * @return
     */
    public static String formatStr2(String src) {
        if (TextUtils.isEmpty(src) || src.equals("null")) {
            return "0.00";
        } else {
            BigDecimal b = new BigDecimal(src);
            double temp = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            DecimalFormat df = new DecimalFormat("#0.00");
            return df.format(temp);
        }
    }

    /**
     * 保留3位小数
     *
     * @return
     */
    public static String formatStr3(String src) {
        if (TextUtils.isEmpty(src) || src.equals("null")) {
            return "0.000";
        } else {
            BigDecimal b = new BigDecimal(src);
            double temp = b.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
            DecimalFormat df = new DecimalFormat("#0.000");
            return df.format(temp);
        }
    }

    /***
     * 检测所输入的银行卡卡号是否正确
     *
     * @param cardId
     * @return
     */
    public static boolean checkBankCard(String cardId) {
        if (cardId.length() > 19 || cardId.length() < 16) {
            return false;
        }
        int oddsum = 0; //奇数求和
        int evensum = 0; //偶数求和
        int allsum = 0;
        int cardNoLength = cardId.length();
        int lastNum = Integer.parseInt(cardId.substring(cardId.length() - 1, cardId.length()));
        cardId = cardId.substring(0, cardId.length() - 1);
        for (int i = cardNoLength - 1; i >= 1; i--) {
            String ch = cardId.substring(i - 1, i);
            int tmpVal = Integer.parseInt(ch);
            if (cardNoLength % 2 == 1) {
                if ((i % 2) == 0) {
                    tmpVal *= 2;
                    if (tmpVal >= 10) {
                        tmpVal -= 9;
                    }
                    evensum += tmpVal;
                } else {
                    oddsum += tmpVal;
                }
            } else {
                if ((i % 2) == 1) {
                    tmpVal *= 2;
                    if (tmpVal >= 10) {
                        tmpVal -= 9;
                    }
                    evensum += tmpVal;
                } else {
                    oddsum += tmpVal;
                }
            }
        }

        allsum = oddsum + evensum;
        allsum += lastNum;
        if ((allsum % 10) == 0)
            return true;
        else
            return false;
    }

    /**
     * 验证URL是否合法，必须带http\https才认为合法，URL可带端口
     *
     * @param url
     * @return
     */
    public static boolean validateUrl(String url) {
        String regEx = "^(http|https|ftp)\\://([a-zA-Z0-9\\.\\-]+(\\:[a-zA-"
                + "Z0-9\\.&%\\$\\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{"
                + "2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}"
                + "[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|"
                + "[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-"
                + "4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0"
                + "-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\.[a-zA-Z]{2,4})(\\:[0-9]+)?(/"
                + "[^/][a-zA-Z0-9\\.\\,\\?\\'\\\\/\\+&%\\$\\=~_\\-@]*)*$";
        return matches(regEx, url);
    }

    /**
     * 转换成形如23.12%的百分数格式
     *
     * @param d
     * @return
     */
    public static String getDMPercent(double d) {
        double temp = d * 100;
        if (temp >= 100) {
            return "100%";
        }
        return String.format("%.2f", temp) + "%";
    }

    /**
     * 转换成形如23.12的百分数格式
     *
     * @param d
     * @return
     */
    public static String getDMPercentNorSymbol(double d) {
        double temp = d * 100;
        return String.format("%.2f", temp);
    }

    /**
     * 获取两位小数点的String
     */
    public static String get2String(double a) {
        BigDecimal b = new BigDecimal(a + "");
        double temp = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        DecimalFormat df = new DecimalFormat("#0.00");
        return df.format(temp);
    }

    /**
     * 获取三位小数点的String
     */
    public static String get3String(double a) {
        BigDecimal b = new BigDecimal(a + "");
        double temp = b.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        DecimalFormat df = new DecimalFormat("#0.000");
        return df.format(temp);
    }



}
